/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ManagedBeans;

import Geral.ErroInternoException;
import Geral.Fachada;
import Usuario.Usuario;
import Usuario.UsuarioExistenteException;
import Usuario.UsuarioInexistenteException;
import java.io.Serializable;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;

/**
 *
 * @author Ivaldo
 */
@ManagedBean
@SessionScoped
public class ManagedBeanUsuario implements Serializable {

    @EJB
    private Fachada fachada;
    private Usuario usuario;
    private EntityManager em;
    private boolean login;

    public ManagedBeanUsuario() {
        this.usuario = new Usuario();
    }

    public ManagedBeanUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario u) {
        this.usuario = u;
    }

    public boolean isLogin() {
        return login;
    }

    public void setLogin(boolean login) {
        this.login = login;
    }

    public String adicionarUsuario() {
        try {
            this.fachada.adicionar(this.usuario);
            FacesContext contexto = FacesContext.getCurrentInstance();
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, null, "Cadastro realizado com sucesso");
            contexto.addMessage(null, msg);
            this.usuario = new Usuario();
        }catch(ErroInternoException e){
            FacesContext contexto = FacesContext.getCurrentInstance();
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Erro Interno", "Ocorreu um erro interno inesperado" + e.getMessage());
            contexto.addMessage(null, msg);
        }catch(UsuarioExistenteException e){
            FacesContext contexto = FacesContext.getCurrentInstance();
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro", "Este cliente já foi cadastrado! " + e.getMessage());
            contexto.addMessage(null, msg);
        }catch(UsuarioInexistenteException e){
            FacesContext contexto = FacesContext.getCurrentInstance();
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Erro", "Ocorreu um erro interno inesperado" + e.getMessage());
            contexto.addMessage(null, msg);
        }
        return null;
    }
    
    public String removerUsuario(){
        try{
            this.fachada.remover(usuario.getId());
            return "lista-html.xhtml";
        }catch(ErroInternoException e){
            return "ErroInterno.xhtmal";    
        }catch(UsuarioInexistenteException e){
            return "UsuarioInexistente.xhtml";
        }
    }
    
    public String buscarUsuario(){
        try{
            this.fachada.buscarUsuario(usuario.getId());
            return "InformacoesUsuario.xhtml";
        }catch(ErroInternoException e){
            return "ErroInterno.xhtml";
        }catch(UsuarioInexistenteException e){
            return "UsuarioInexistente.xhtml";
        }
    }
    
    public String atualizarSenhaUsuario(){
        return "atualizarsenha-usuario.xhtml";
    }
    
    public String senhaatualizadaUsuario(){
        try{
            this.fachada.atualizar(this.usuario);
            return "dadospessoais-usuario.xhtml";
        }catch(ErroInternoException e){
            FacesContext contexto = FacesContext.getCurrentInstance();
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro Interno", "Ocorreu um erro inesperado");
            contexto.addMessage(null, msg);
            return null;
        }catch(UsuarioInexistenteException e){
            return null;
        }
    }
    
    public String atualizarUsuario(){
        try{
            this.fachada.atualizar(this.usuario);
            FacesContext contexto = FacesContext.getCurrentInstance();
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, null, "Dados atualizados com sucesso");
            contexto.addMessage(null, msg);
        }catch(ErroInternoException e){
            FacesContext contexto = FacesContext.getCurrentInstance();
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro Interno", "Ocorreu um erro inesperado");
            contexto.addMessage(null, msg);
            return null;
        }catch(UsuarioInexistenteException e){
            
        }
        return null;
    }
    
    public String loginUsuario(){
        try{
            this.usuario = this.fachada.loginUsuario(usuario.getLogin(), usuario.getSenha());
            this.login = true;
            FacesContext contexto = FacesContext.getCurrentInstance();
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, null, "Cliente logado com sucesso");
            contexto.addMessage(null, msg);
            return "index.xhtml";
        }catch(ErroInternoException e){
            FacesContext contexto = FacesContext.getCurrentInstance();
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Erro Interno", "Ocorreu um errointerno inesperado! " + e.getMessage());
            contexto.addMessage(null, msg);
        }catch(UsuarioInexistenteException e){
            FacesContext contexto = FacesContext.getCurrentInstance();
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro Interno", "Ocorreu um errointerno inesperado! " + e.getMessage());
            contexto.addMessage(null, msg);
        }return null;
    }
    
    public void logout(){
        login = false;
        this.usuario = new Usuario();
    }
    
    public List<Usuario> listaUsuarios() throws ErroInternoException{
        try{
            List<Usuario> listaUsuarios = this.fachada.listaUsuario(usuario);
            return listaUsuarios;
        }catch(ErroInternoException e){
            throw new ErroInternoException(e);
        }
    }
}
